/**
 * Modelisation d'une Molecule, definie par son nom, son abscisse et
 * son ordonnee. La composition en Cc est automatiquement determinee
 * en fonction du nom de la molecule. Si celle-ci n'existe pas, alors
 * un message d'erreur est affiche. A l'avenir des molecules pourront
 * etre ajoutees par l'utilisateur.
 */
function Molecule(nom, x, y){
    Entite.call(this, nom, x, y);
    
    /**
     * Duree de vie moyenne d'une molecule. La meme pour toutes les
     * molecules
     *
     * @type {Number}
     */
    this.DUREE_VIE_MOYENNE = 1800;
    /**
     * Ecart possible maximal pour la duree de vie d'une molecule.
     * La duree de vie de la molecule est donc definie aleatoirement
     * a sa naissance, entre + ou - la constante de duree de vie
     * moyenne
     *
     * @type {Number}
     */
    this.ECART_VIE = 50;
    /**
     * Superficie sur laquelle s'etend la molecule et sur laquelle
     * elle liberera les Ccs lors de sa mort
     *
     * @type {Number}
     */
    this.TAILLE = 6;
    /**
     * Si l'un des elements n'est pas present, alors on a la valeur 0.
     * Liste des CCs :
     * 		Acetone, Acide sulfurique, Benzene, Eau, Ethanol
     *
     * @type {Array}
     */
    this.COMPOSITION_CC = new Array();
    switch (this.nom) {
        case 'Bretoine':
            this.COMPOSITION_CC.push(0, 0, 2, 0, 2);
            break;
        case 'Carottoine':
            this.COMPOSITION_CC.push(0, 0, 7, 2, 0);
            break;
        case 'Haricoine':
            this.COMPOSITION_CC.push(2, 0, 0, 3, 1);
            break;
        case 'Mongoloine':
            this.COMPOSITION_CC.push(3, 5, 1, 0, 4);
            break;
        case 'Oppiomine':
            this.COMPOSITION_CC.push(0, 3, 8, 0, 0);
            break;
        case 'Pommine':
            this.COMPOSITION_CC.push(0, 1, 0, 5, 2);
            break;
        case 'Kiwine':
            this.COMPOSITION_CC.push(2, 0, 0, 5, 0);
            break;
        default:
            alert('Molecule inexistante [Constructeur:Molecule~l.65]');
            //TODO : creation d'une nouvelle molecule du nom donne par l'utilisateur + MAJ de la doc de la classe
            break;
    }
    /**
     * Age maximal de la cellule. Genere grace aux deux constantes
     * sur la vie de la molecule.
     *
     * @type {Number}
     */
    this.age_max = this.DUREE_VIE_MOYENNE;
    if (Math.random() > 0.5) 
        this.age_max += Math.round(Math.random() * this.ECART_VIE);
    else 
        this.age_max -= Math.round(Math.random() * this.ECART_VIE);
    /**
     * Compteur qui indique l'age courante de la molecule
     *
     * @type {Number}
     */
    this.age = 0;
    
    /**
     * Fonction qui permet a une molecule de se deplacer
     *
     * @param {Object} monde Monde de la molecule
     * @deprecated
     */
    this.deplacement = function(monde){
        this.position.seDeplace();
        this.x = this.position.getX();
        this.y = this.position.getY();
    }
    
    /**
     * Methode qui verifie si une molecule est fabricable avec ce
     * qui est en stock dans la cellule (parametre
     * contenuCelluleCcs) et retourne une array de la recette de
     * la molecule, ainsi qu'un booleen indiquant si les stocks
     * sont suffisants non.
     *
     * @param {Object} indice Identifiant de la molecule demandee
     * @param {Object} contenuCelluleCcs Ccs contenus dans la cellule
     * @return {Array} Composition de la molecule, et dans la
     * derniere case un booleen indiquant la faisabilite.
     */
    this.fabricable = function(indice, contenuCelluleCcs){
        var array_temp = new Array();
        switch (indice) {
            case 0:
                array_temp.push(2, 0, 0, 3, 1);
                break;
            case 1:
                array_temp.push(0, 0, 7, 2, 0);
                break;
            case 2:
                array_temp.push(0, 1, 0, 5, 2);
                break;
            case 3:
                array_temp.push(0, 3, 8, 0, 0);
                break;
            case 4:
                array_temp.push(0, 0, 2, 0, 2);
                break;
            case 5:
                array_temp.push(2, 0, 0, 5, 0);
                break;
            case 6:
                array_temp.push(3, 5, 1, 0, 4);
                break;
            default:
                alert('Molecule inexistante [Molecule~l.137]');
                break;
        }
        for (var i = 0; i < 5; i++) {
            if (contenuCelluleCcs[i] < array_temp[i]) {
                array_temp[5] = false;
                return array_temp;
            }
        }
        array_temp[5] = true;
        return array_temp;
    }
    
    /**
     * Methode qui permet de savoir si une molecule meurt. Si
     * c'est le cas, alors ses composants sont en partie redistribues
     * dans le monde
     *
     * @param {Object} monde Monde de la molecule
     * @return {Boolean} vrai si la molecule est detruite, faux sinon
     */
    this.rendreLAme = function(monde){
        if (this.age > this.age_max) {
            var name;
            for (var i = 0; i < 5; i++) {
                switch (i) {
                    case 0:
                        name = 'Acetone';
                        break;
                    case 1:
                        name = 'Acide sulfurique';
                        break;
                    case 2:
                        name = 'Benzene';
                        break;
                    case 3:
                        name = 'Eau';
                        break;
                    case 4:
                        name = 'Ethanol';
                        break;
                    default:
                        break;
                }
                for (var j = 0; j < this.COMPOSITION_CC[i]; j++) {
                    if (Math.random() > 0.5) 
                        if (Math.random() > 0.5) 
                            monde.ajouter(name, (this.x +
                            Math.round(Math.random() * this.TAILLE)), (this.y +
                            Math.round(Math.random() * this.TAILLE)));
                        else 
                            monde.ajouter(name, (this.x +
                            Math.round(Math.random() * this.TAILLE)), (this.y -
                            Math.round(Math.random() * this.TAILLE)));
                    else 
                        if (Math.random() > 0.5) 
                            monde.ajouter(name, (this.x -
                            Math.round(Math.random() * this.TAILLE)), (this.y +
                            Math.round(Math.random() * this.TAILLE)));
                        else 
                            monde.ajouter(name, (this.x -
                            Math.round(Math.random() * this.TAILLE)), (this.y -
                            Math.round(Math.random() * this.TAILLE)));
                }
            }
            monde.supprimerMolecule(this.x, this.y);
            return true;
        }
        else 
            return false;
    }
    
    /**
     * Methode qui permet a une molecule d'evoluer dans le monde.
     * Elle se deplace et vieillit.
     *
     * @param {Object} monde Monde de la molecule
     */
    this.evolue = function(monde){
        this.age++;
        if (!this.rendreLAme(monde)) 
            this.deplacement(monde);
    };
}
